Fix remaining preload tests flaking on wpt.fyi This is a follow-up to https://github.com/web-platform-tests/wpt/pull/15075. https://crrev.com/c/1436777 successfully fixed the wpt.fyi flakiness for link-header-preload-srcset.tentative.html and link-header-preload-nonce.html. This patch fixes that for the remaining preload tests. - Use step_timeout instead of dummy.js?pipe=trickle, because dummy.js?pipe=trickle may be loaded from cache with no delay. - Replace verifyNumberOfDownloads() with - verifyNumberOfResourceTimingEntries() if possible - A new helper function verifyLoadedAndNoDoubleDownload() that doesn't fail if the resource was already cached before running the test. Bug: 922343 Change-Id: Ia9b7c4bd49dd76463df4607349fe4f935e5410d0 Reviewed-on: https://chromium-review.googlesource.com/c/1442020 Reviewed-by: Kinuko Yasuda <kinuko@chromium.org> Commit-Queue: Kunihiko Sakamoto <ksakamoto@chromium.org> Cr-Commit-Position: refs/heads/master@{#629029} diff --git a/preload/avoid-delaying-onload-link-preload.html b/preload/avoid-delaying-onload-link-preload.html index 77838c3..a1b19c8 100644 --- a/preload/avoid-delaying-onload-link-preload.html +++ b/preload/avoid-delaying-onload-link-preload.html
@@ -9,7 +9,7 @@ <script> window.addEventListener("load", t.step_func(function() { verifyPreloadAndRTSupport(); - verifyNumberOfDownloads("/resources/dummy.js?pipe=trickle(d5)", 0); + verifyNumberOfResourceTimingEntries("/resources/dummy.js?pipe=trickle(d5)", 0); t.done(); })); </script> diff --git a/preload/delaying-onload-link-preload-after-discovery.html b/preload/delaying-onload-link-preload-after-discovery.html index 095d89a..1c856d1 100644 --- a/preload/delaying-onload-link-preload-after-discovery.html +++ b/preload/delaying-onload-link-preload-after-discovery.html
@@ -11,8 +11,8 @@ <script> window.addEventListener("load", t.step_func(function() { verifyPreloadAndRTSupport(); - verifyNumberOfDownloads("resources/dummy.js?pipe=trickle(d5)", 1); - verifyNumberOfDownloads("resources/square.png?pipe=trickle(d5)", 1); + verifyLoadedAndNoDoubleDownload("resources/dummy.js?pipe=trickle(d5)"); + verifyLoadedAndNoDoubleDownload("resources/square.png?pipe=trickle(d5)"); t.done(); })); var script = document.createElement("script"); diff --git a/preload/download-resources.html b/preload/download-resources.html index dc2b469..510ebb4 100644 --- a/preload/download-resources.html +++ b/preload/download-resources.html
@@ -16,20 +16,21 @@ <link rel=preload href="resources/dummy.xml?novalue"> <link rel=preload href="resources/dummy.xml" as="fetch"> <body> -<script src="resources/dummy.js?pipe=trickle(d5)&download-resources"></script> <script> window.addEventListener("load", t.step_func(function() { - verifyPreloadAndRTSupport() - verifyNumberOfDownloads("resources/dummy.js", 1); - verifyNumberOfDownloads("resources/dummy.css", 1); - verifyNumberOfDownloads("/fonts/CanvasTest.ttf", 1); - verifyNumberOfDownloads("resources/white.mp4", 1); - verifyNumberOfDownloads("resources/sound_5.oga", 1); - verifyNumberOfDownloads("resources/foo.vtt", 1); - verifyNumberOfDownloads("resources/dummy.xml?foo=bar", 0); - verifyNumberOfDownloads("resources/dummy.xml?novalue", 0); - verifyNumberOfDownloads("resources/dummy.xml", 1); - t.done(); + t.step_timeout(function() { + verifyPreloadAndRTSupport() + verifyNumberOfResourceTimingEntries("resources/dummy.js", 1); + verifyNumberOfResourceTimingEntries("resources/dummy.css", 1); + verifyNumberOfResourceTimingEntries("/fonts/CanvasTest.ttf", 1); + verifyNumberOfResourceTimingEntries("resources/white.mp4", 1); + verifyNumberOfResourceTimingEntries("resources/sound_5.oga", 1); + verifyNumberOfResourceTimingEntries("resources/foo.vtt", 1); + verifyNumberOfResourceTimingEntries("resources/dummy.xml?foo=bar", 0); + verifyNumberOfResourceTimingEntries("resources/dummy.xml?novalue", 0); + verifyNumberOfResourceTimingEntries("resources/dummy.xml", 1); + t.done(); + }, 5000); })); </script> </body> diff --git a/preload/dynamic-adding-preload-imagesrcset.tentative.html b/preload/dynamic-adding-preload-imagesrcset.tentative.html index be8f0af..e1b8431 100644 --- a/preload/dynamic-adding-preload-imagesrcset.tentative.html +++ b/preload/dynamic-adding-preload-imagesrcset.tentative.html
@@ -17,15 +17,14 @@ link.imageSizes = "400px"; link.onload = t.step_func(function() { t.step_timeout(function() { - verifyNumberOfDownloads("resources/square.png?default", 0); - verifyNumberOfDownloads("resources/square.png?200", 0); - verifyNumberOfDownloads("resources/square.png?400", 1); - verifyNumberOfDownloads("resources/square.png?800", 0); + verifyNumberOfResourceTimingEntries("resources/square.png?default", 0); + verifyNumberOfResourceTimingEntries("resources/square.png?200", 0); + verifyNumberOfResourceTimingEntries("resources/square.png?400", 1); + verifyNumberOfResourceTimingEntries("resources/square.png?800", 0); t.done(); }, 0); }); document.body.appendChild(link); }); </script> -<script src="resources/dummy.js?pipe=trickle(d5)&dynamic-adding-preload"></script> </body> diff --git a/preload/dynamic-adding-preload-nonce.html b/preload/dynamic-adding-preload-nonce.html index 10dae6b..19e0947 100644 --- a/preload/dynamic-adding-preload-nonce.html +++ b/preload/dynamic-adding-preload-nonce.html
@@ -14,7 +14,7 @@ link.nonce = "abc"; link.onload = link.onerror = t.step_func(function() { t.step_timeout(function() { - verifyNumberOfDownloads("resources/dummy.js?with-nonce", 1); + verifyNumberOfResourceTimingEntries("resources/dummy.js?with-nonce", 1); t.done(); }, 0); }); @@ -29,7 +29,7 @@ link.href = "resources/dummy.js?without-nonce"; link.onload = link.onerror = t.step_func(function() { t.step_timeout(function() { - verifyNumberOfDownloads("resources/dummy.js?without-nonce", 0); + verifyNumberOfResourceTimingEntries("resources/dummy.js?without-nonce", 0); t.done(); }, 0); }); diff --git a/preload/dynamic-adding-preload.html b/preload/dynamic-adding-preload.html index 2a299bd..0cecc19 100644 --- a/preload/dynamic-adding-preload.html +++ b/preload/dynamic-adding-preload.html
@@ -15,12 +15,11 @@ link.href = "resources/dummy.js?dynamic-adding-preload"; link.onload = t.step_func(function() { t.step_timeout(function() { - verifyNumberOfDownloads("resources/dummy.js?dynamic-adding-preload", 1); + verifyNumberOfResourceTimingEntries("resources/dummy.js?dynamic-adding-preload", 1); t.done(); }, 0); }); document.body.appendChild(link); }); </script> -<script src="resources/dummy.js?pipe=trickle(d5)&dynamic-adding-preload"></script> </body> diff --git a/preload/link-header-on-subresource.html b/preload/link-header-on-subresource.html index a02bc7c..087a342 100644 --- a/preload/link-header-on-subresource.html +++ b/preload/link-header-on-subresource.html
@@ -6,12 +6,13 @@ var t = async_test('Makes sure that Link headers on subresources preload resources'); </script> <link rel=stylesheet href="resources/dummy-preloads-subresource.css?link-header-on-subresource"> -<script src="resources/dummy.js?pipe=trickle(d5)&link-header-on-subresources"></script> <script> window.addEventListener("load", t.step_func(function() { - verifyPreloadAndRTSupport(); - verifyNumberOfDownloads("/fonts/CanvasTest.ttf?link-header-on-subresource", 1); - t.done(); + t.step_timeout(function() { + verifyPreloadAndRTSupport(); + verifyNumberOfResourceTimingEntries("/fonts/CanvasTest.ttf?link-header-on-subresource", 1); + t.done(); + }, 5000); })); </script> diff --git a/preload/link-header-preload-delay-onload.html b/preload/link-header-preload-delay-onload.html index 7f38f8c..a445d80 100644 --- a/preload/link-header-preload-delay-onload.html +++ b/preload/link-header-preload-delay-onload.html
@@ -31,10 +31,10 @@ } } assert_true(found_background_first); - verifyNumberOfDownloads("resources/square.png?link-header-preload-delay-onload", 1); - verifyNumberOfDownloads("resources/square.png?background", 1); - verifyNumberOfDownloads("resources/dummy.js?link-header-preload-delay-onload", 1); - verifyNumberOfDownloads("resources/dummy.css?link-header-preload-delay-onload", 1); + verifyLoadedAndNoDoubleDownload("resources/square.png?link-header-preload-delay-onload"); + verifyLoadedAndNoDoubleDownload("resources/square.png?background"); + verifyLoadedAndNoDoubleDownload("resources/dummy.js?link-header-preload-delay-onload"); + verifyLoadedAndNoDoubleDownload("resources/dummy.css?link-header-preload-delay-onload"); t.done(); })); </script> diff --git a/preload/link-header-preload-nonce.html b/preload/link-header-preload-nonce.html index 240d6f1..dc1ec10 100644 --- a/preload/link-header-preload-nonce.html +++ b/preload/link-header-preload-nonce.html
@@ -5,12 +5,13 @@ <script nonce="abc"> var t = async_test('Makes sure that Link headers preload resources with CSP nonce'); </script> -<script nonce="abc" src="resources/dummy.js?pipe=trickle(d5)&link-header-preload-nonce"></script> <script nonce="abc"> window.addEventListener('load', t.step_func(function() { - verifyPreloadAndRTSupport(); - verifyNumberOfResourceTimingEntries("resources/dummy.js?from-header&without-nonce", 0); - verifyNumberOfResourceTimingEntries("resources/dummy.js?from-header&with-nonce", 1); - t.done(); + t.step_timeout(function() { + verifyPreloadAndRTSupport(); + verifyNumberOfResourceTimingEntries("resources/dummy.js?from-header&without-nonce", 0); + verifyNumberOfResourceTimingEntries("resources/dummy.js?from-header&with-nonce", 1); + t.done(); + }, 5000); })); </script> diff --git a/preload/link-header-preload-srcset.tentative.html b/preload/link-header-preload-srcset.tentative.html index 024da96..8d05754 100644 --- a/preload/link-header-preload-srcset.tentative.html +++ b/preload/link-header-preload-srcset.tentative.html
@@ -7,21 +7,22 @@ var t = async_test('Makes sure that Link headers preload images with (experimental) imagesrcset/imagesizes attributes.'); </script> <body> -<script src="resources/dummy.js?pipe=trickle(d3)&link-header-preload-srcset"></script> <script> window.addEventListener("load", t.step_func(function() { - verifyPreloadAndRTSupport(); - verifyNumberOfResourceTimingEntries('resources/square.png?from-header&1x', 1); - verifyNumberOfResourceTimingEntries('resources/square.png?from-header&2x', 0); - verifyNumberOfResourceTimingEntries('resources/square.png?from-header&3x', 0); - verifyNumberOfResourceTimingEntries('resources/square.png?from-header&base', 0); - verifyNumberOfResourceTimingEntries('resources/square.png?from-header&200', 0); - verifyNumberOfResourceTimingEntries('resources/square.png?from-header&400', 1); - verifyNumberOfResourceTimingEntries('resources/square.png?from-header&800', 0); - verifyNumberOfResourceTimingEntries('resources/square.png?from-header&150', 0); - verifyNumberOfResourceTimingEntries('resources/square.png?from-header&300', 1); - verifyNumberOfResourceTimingEntries('resources/square.png?from-header&600', 0); - t.done(); + t.step_timeout(function() { + verifyPreloadAndRTSupport(); + verifyNumberOfResourceTimingEntries('resources/square.png?from-header&1x', 1); + verifyNumberOfResourceTimingEntries('resources/square.png?from-header&2x', 0); + verifyNumberOfResourceTimingEntries('resources/square.png?from-header&3x', 0); + verifyNumberOfResourceTimingEntries('resources/square.png?from-header&base', 0); + verifyNumberOfResourceTimingEntries('resources/square.png?from-header&200', 0); + verifyNumberOfResourceTimingEntries('resources/square.png?from-header&400', 1); + verifyNumberOfResourceTimingEntries('resources/square.png?from-header&800', 0); + verifyNumberOfResourceTimingEntries('resources/square.png?from-header&150', 0); + verifyNumberOfResourceTimingEntries('resources/square.png?from-header&300', 1); + verifyNumberOfResourceTimingEntries('resources/square.png?from-header&600', 0); + t.done(); + }, 3000); })); </script> </body> diff --git a/preload/link-header-preload.html b/preload/link-header-preload.html index 94a731b..0ca364b 100644 --- a/preload/link-header-preload.html +++ b/preload/link-header-preload.html
@@ -6,14 +6,15 @@ var t = async_test('Makes sure that Link headers preload resources'); </script> <body> -<script src="resources/dummy.js?pipe=trickle(d5)&link-header-preload"></script> <script> window.addEventListener("load", t.step_func(function() { - verifyPreloadAndRTSupport(); - verifyNumberOfDownloads("resources/square.png?link-header-preload", 1); - verifyNumberOfDownloads("resources/dummy.js?link-header-preload", 1); - verifyNumberOfDownloads("resources/dummy.css?link-header-preload", 1); - t.done(); + t.step_timeout(function() { + verifyPreloadAndRTSupport(); + verifyNumberOfResourceTimingEntries("resources/square.png?link-header-preload", 1); + verifyNumberOfResourceTimingEntries("resources/dummy.js?link-header-preload", 1); + verifyNumberOfResourceTimingEntries("resources/dummy.css?link-header-preload", 1); + t.done(); + }, 5000); })); </script> </body> diff --git a/preload/onerror-event.html b/preload/onerror-event.html index 5fae70d..8190be8 100644 --- a/preload/onerror-event.html +++ b/preload/onerror-event.html
@@ -28,21 +28,22 @@ <link rel=preload href="non-existent/dummy.xml?foo" as=foobarxmlthing onerror="gibberishFailed = true;"> <link rel=preload href="non-existent/dummy.xml?fetch" as=fetch onerror="fetchFailed = true;"> <link rel=preload href="non-existent/dummy.xml?empty" onerror="emptyFailed = true;"> -<script src="resources/dummy.js?pipe=trickle(d5)&onerror-event"></script> <script> window.onload = t.step_func(function() { - verifyPreloadAndRTSupport(); - assert_true(styleFailed, "style triggered error event"); - assert_true(scriptFailed, "script triggered error event"); - assert_true(imageFailed, "image triggered error event"); - assert_true(fontFailed, "font triggered error event"); - assert_true(videoFailed, "video triggered error event"); - assert_true(audioFailed, "audio triggered error event"); - assert_true(trackFailed, "track triggered error event"); - assert_false(gibberishFailed, "gibberish as value did not trigger error event"); - assert_true(fetchFailed, "fetch as triggered error event"); - assert_false(emptyFailed, "empty as triggered error event"); - t.done(); + t.step_timeout(function() { + verifyPreloadAndRTSupport(); + assert_true(styleFailed, "style triggered error event"); + assert_true(scriptFailed, "script triggered error event"); + assert_true(imageFailed, "image triggered error event"); + assert_true(fontFailed, "font triggered error event"); + assert_true(videoFailed, "video triggered error event"); + assert_true(audioFailed, "audio triggered error event"); + assert_true(trackFailed, "track triggered error event"); + assert_false(gibberishFailed, "gibberish as value did not trigger error event"); + assert_true(fetchFailed, "fetch as triggered error event"); + assert_false(emptyFailed, "empty as triggered error event"); + t.done(); + }, 5000); }); </script> </body> diff --git a/preload/onload-event.html b/preload/onload-event.html index 6af2d64..f9348b8 100644 --- a/preload/onload-event.html +++ b/preload/onload-event.html
@@ -27,22 +27,23 @@ <link rel=preload href="resources/dummy.xml?fetch" as=fetch onload="fetchLoaded = true;"> <link rel=preload href="resources/dummy.xml" onload="noTypeLoaded = true;"> <body> -<script src="resources/dummy.js?pipe=trickle(d5)&onload-event"></script> <script> window.onload = t.step_func(function() { - verifyPreloadAndRTSupport(); - assert_true(styleLoaded, "style triggered load event"); - assert_true(scriptLoaded, "script triggered load event"); - assert_true(imageLoaded, "image triggered load event"); - assert_true(fontLoaded, "font triggered load event"); - assert_true(videoLoaded, "video triggered load event"); - assert_true(audioLoaded, "audio triggered load event"); - assert_true(trackLoaded, "track triggered load event"); - assert_false(gibberishLoaded, "gibberish as value triggered load event"); - assert_false(gibberishErrored, "gibberish as value triggered error event"); - assert_true(fetchLoaded, "fetch as value triggered load event"); - assert_false(noTypeLoaded, "empty as triggered load event"); - t.done(); + t.step_timeout(function() { + verifyPreloadAndRTSupport(); + assert_true(styleLoaded, "style triggered load event"); + assert_true(scriptLoaded, "script triggered load event"); + assert_true(imageLoaded, "image triggered load event"); + assert_true(fontLoaded, "font triggered load event"); + assert_true(videoLoaded, "video triggered load event"); + assert_true(audioLoaded, "audio triggered load event"); + assert_true(trackLoaded, "track triggered load event"); + assert_false(gibberishLoaded, "gibberish as value triggered load event"); + assert_false(gibberishErrored, "gibberish as value triggered error event"); + assert_true(fetchLoaded, "fetch as value triggered load event"); + assert_false(noTypeLoaded, "empty as triggered load event"); + t.done(); + }, 5000); }); </script> </body> diff --git a/preload/preload-csp.sub.html b/preload/preload-csp.sub.html index 8e5e45b..7fe06eb 100644 --- a/preload/preload-csp.sub.html +++ b/preload/preload-csp.sub.html
@@ -16,19 +16,20 @@ <link rel=preload href="resources/dummy.xml?foo=bar" as=foobarxmlthing> <link rel=preload href="resources/dummy.xml"> <body> -<script src="resources/dummy.js?pipe=trickle(d5)&preload-csp"></script> <script> window.onload = t.step_func(function() { - verifyPreloadAndRTSupport(); - verifyNumberOfDownloads("{{host}}:{{ports[http][1]}}/preload/resources/dummy.js", 0); - verifyNumberOfDownloads("resources/dummy.css", 0); - verifyNumberOfDownloads("resources/square.png", 0); - verifyNumberOfDownloads("/fonts/CanvasTest.ttf", 0); - verifyNumberOfDownloads("resources/white.mp4", 0); - verifyNumberOfDownloads("resources/sound_5.oga", 0); - verifyNumberOfDownloads("resources/foo.vtt", 0); - verifyNumberOfDownloads("resources/dummy.xml", 0); - t.done(); + t.step_timeout(function() { + verifyPreloadAndRTSupport(); + verifyNumberOfResourceTimingEntries("{{host}}:{{ports[http][1]}}/preload/resources/dummy.js", 0); + verifyNumberOfResourceTimingEntries("resources/dummy.css", 0); + verifyNumberOfResourceTimingEntries("resources/square.png", 0); + verifyNumberOfResourceTimingEntries("/fonts/CanvasTest.ttf", 0); + verifyNumberOfResourceTimingEntries("resources/white.mp4", 0); + verifyNumberOfResourceTimingEntries("resources/sound_5.oga", 0); + verifyNumberOfResourceTimingEntries("resources/foo.vtt", 0); + verifyNumberOfResourceTimingEntries("resources/dummy.xml", 0); + t.done(); + }, 5000); }); </script> diff --git a/preload/preload-default-csp.sub.html b/preload/preload-default-csp.sub.html index cb080e6..7813e36 100644 --- a/preload/preload-default-csp.sub.html +++ b/preload/preload-default-csp.sub.html
@@ -16,19 +16,20 @@ <link rel=preload href="resources/dummy.xml?foo=bar" as=foobarxmlthing> <link rel=preload href="resources/dummy.xml"> <body> -<script src="resources/dummy.js?pipe=trickle(d5)&preload-default-csp"></script> <script> window.onload = t.step_func(function() { - verifyPreloadAndRTSupport(); - verifyNumberOfDownloads("{{host}}:{{ports[http][1]}}/preload/resources/dummy.js", 0); - verifyNumberOfDownloads("resources/dummy.css", 0); - verifyNumberOfDownloads("resources/square.png", 0); - verifyNumberOfDownloads("/fonts/CanvasTest.ttf", 0); - verifyNumberOfDownloads("resources/white.mp4", 0); - verifyNumberOfDownloads("resources/sound_5.oga", 0); - verifyNumberOfDownloads("resources/foo.vtt", 0); - verifyNumberOfDownloads("resources/dummy.xml", 0); - t.done(); + t.step_timeout(function() { + verifyPreloadAndRTSupport(); + verifyNumberOfResourceTimingEntries("{{host}}:{{ports[http][1]}}/preload/resources/dummy.js", 0); + verifyNumberOfResourceTimingEntries("resources/dummy.css", 0); + verifyNumberOfResourceTimingEntries("resources/square.png", 0); + verifyNumberOfResourceTimingEntries("/fonts/CanvasTest.ttf", 0); + verifyNumberOfResourceTimingEntries("resources/white.mp4", 0); + verifyNumberOfResourceTimingEntries("resources/sound_5.oga", 0); + verifyNumberOfResourceTimingEntries("resources/foo.vtt", 0); + verifyNumberOfResourceTimingEntries("resources/dummy.xml", 0); + t.done(); + }, 5000); }); </script> diff --git a/preload/preload-with-type.html b/preload/preload-with-type.html index 8578143..83eafc5 100644 --- a/preload/preload-with-type.html +++ b/preload/preload-with-type.html
@@ -47,19 +47,20 @@ </script> <link rel=preload href="resources/foo.vtt" as=track type="text/foobar" onload="gibberishLoaded++;"> <body> -<script src="resources/dummy.js?pipe=trickle(d5)&preload-with-type"></script> <script> window.onload = t.step_func(function() { - verifyPreloadAndRTSupport(); - assert_true(styleLoaded, "style triggered load event"); - assert_true(scriptLoaded, "script triggered load event"); - assert_true(imageLoaded, "image triggered load event"); - assert_true(fontLoaded, "font triggered load event"); - assert_true(videoLoaded, "video triggered load event"); - assert_true(audioLoaded, "audio triggered load event"); - assert_true(trackLoaded, "track triggered load event"); - assert_equals(gibberishLoaded, 0, "resources with gibberish type should not be loaded"); - t.done(); + t.step_timeout(function() { + verifyPreloadAndRTSupport(); + assert_true(styleLoaded, "style triggered load event"); + assert_true(scriptLoaded, "script triggered load event"); + assert_true(imageLoaded, "image triggered load event"); + assert_true(fontLoaded, "font triggered load event"); + assert_true(videoLoaded, "video triggered load event"); + assert_true(audioLoaded, "audio triggered load event"); + assert_true(trackLoaded, "track triggered load event"); + assert_equals(gibberishLoaded, 0, "resources with gibberish type should not be loaded"); + t.done(); + }, 5000); }); </script> </body> diff --git a/preload/resources/preload_helper.js b/preload/resources/preload_helper.js index b2cf832..f464908 100644 --- a/preload/resources/preload_helper.js +++ b/preload/resources/preload_helper.js
@@ -10,19 +10,32 @@ return new URL(url, location.href).href; } -function verifyNumberOfDownloads(url, number) -{ - var numDownloads = 0; - performance.getEntriesByName(getAbsoluteURL(url)).forEach(entry => { - if (entry.transferSize > 0) { - numDownloads++; - } - }); - assert_equals(numDownloads, number, url); -} - function verifyNumberOfResourceTimingEntries(url, number) { var numEntries = performance.getEntriesByName(getAbsoluteURL(url)).length; assert_equals(numEntries, number, url); } + +// Verifies that the resource is loaded, but not downloaded from network +// more than once. This can be used to verify that a preloaded resource is +// not downloaded again when used. +function verifyLoadedAndNoDoubleDownload(url) { + var entries = performance.getEntriesByName(getAbsoluteURL(url)); + // UA may create separate RT entries for preload and normal load, + // so we just check (entries.length > 0). + assert_greater_than(entries.length, 0, url + ' should be loaded'); + + var numDownloads = 0; + entries.forEach(entry => { + // transferSize is zero if the resource is loaded from cache. + if (entry.transferSize > 0) { + numDownloads++; + } + }); + // numDownloads can be zero if the resource was already cached before running + // the test (for example, when the test is running repeatedly without + // clearing cache between runs). + assert_less_than_equal( + numDownloads, 1, + url + ' should be downloaded from network at most once'); +} diff --git a/preload/single-download-late-used-preload.html b/preload/single-download-late-used-preload.html index 5549cb8..51533ba 100644 --- a/preload/single-download-late-used-preload.html +++ b/preload/single-download-late-used-preload.html
@@ -9,11 +9,11 @@ assert_equals(link.as, "image"); link.addEventListener("load", () => { verifyPreloadAndRTSupport(); - verifyNumberOfDownloads("resources/square.png?pipe=trickle(d1)", 1); + verifyNumberOfResourceTimingEntries("resources/square.png?pipe=trickle(d1)", 1); var img = document.createElement("img"); img.src = "resources/square.png?pipe=trickle(d1)"; img.onload = () => { - verifyNumberOfDownloads("resources/square.png?pipe=trickle(d1)", 1); + verifyLoadedAndNoDoubleDownload("resources/square.png?pipe=trickle(d1)"); done(); }; document.body.appendChild(img); diff --git a/preload/single-download-preload.html b/preload/single-download-preload.html index e8f2617..16d893c 100644 --- a/preload/single-download-preload.html +++ b/preload/single-download-preload.html
@@ -16,7 +16,6 @@ <link rel=preload href="resources/dummy.xml?foo=bar" as=foobarxmlthing> <link rel=preload href="resources/dummy.xml?single-download-preload"> <body> -<script src="resources/dummy.js?pipe=trickle(d3)&single-download-preload"></script> <style> #background { width: 200px; @@ -45,17 +44,17 @@ window.addEventListener("load", t.step_func(function() { verifyPreloadAndRTSupport(); setTimeout(t.step_func(function() { - verifyNumberOfDownloads("resources/dummy.js?single-download-preload", 1); - verifyNumberOfDownloads("resources/dummy.css?single-download-preload", 1); - verifyNumberOfDownloads("resources/square.png?single-download-preload", 1); - verifyNumberOfDownloads("resources/square.png?background&single-download-preload", 1); - verifyNumberOfDownloads("/fonts/CanvasTest.ttf?single-download-preload", 1); - verifyNumberOfDownloads("resources/dummy.xml?foobar", 0); - verifyNumberOfDownloads("resources/foo.vtt?single-download-preload", 1); - verifyNumberOfDownloads("resources/dummy.xml?single-download-preload", 1); + verifyLoadedAndNoDoubleDownload("resources/dummy.js?single-download-preload"); + verifyLoadedAndNoDoubleDownload("resources/dummy.css?single-download-preload"); + verifyLoadedAndNoDoubleDownload("resources/square.png?single-download-preload"); + verifyLoadedAndNoDoubleDownload("resources/square.png?background&single-download-preload"); + verifyLoadedAndNoDoubleDownload("/fonts/CanvasTest.ttf?single-download-preload"); + verifyNumberOfResourceTimingEntries("resources/dummy.xml?foobar", 0); + verifyLoadedAndNoDoubleDownload("resources/foo.vtt?single-download-preload"); + verifyLoadedAndNoDoubleDownload("resources/dummy.xml?single-download-preload"); // FIXME: We should verify for video and audio as well, but they seem to (flakily?) trigger multiple partial requests. t.done(); - }), 0); + }), 3000); })); </script> <span>PASS - this text is here just so that the browser will download the font.</span>